/**
 * 多语言配置
 * 支持的语言类型和语言检测逻辑
 */

// 支持的语言类型
export const SUPPORTED_LANGUAGES = {
  ZH_CN: 'zh-CN', // 简体中文
  ZH_TW: 'zh-TW', // 繁体中文
  EN_US: 'en-US', // 英文
  JA_JP: 'ja-JP', // 日文
  KO_KR: 'ko-KR', // 韩文
  FR_FR: 'fr-FR', // 法文
  DE_DE: 'de-DE', // 德文
  ES_ES: 'es-ES', // 西班牙文
  PT_BR: 'pt-BR', // 葡萄牙文
  RU_RU: 'ru-RU'  // 俄文
} as const;

// 语言类型
export type LanguageType = typeof SUPPORTED_LANGUAGES[keyof typeof SUPPORTED_LANGUAGES];

// 默认语言
export const DEFAULT_LANGUAGE: LanguageType = SUPPORTED_LANGUAGES.ZH_CN;

// 语言映射表（用于语言代码转换）
export const LANGUAGE_MAP: Record<string, LanguageType> = {
  // 中文变体
  'zh': SUPPORTED_LANGUAGES.ZH_CN,
  'zh-CN': SUPPORTED_LANGUAGES.ZH_CN,
  'zh-Hans': SUPPORTED_LANGUAGES.ZH_CN,
  'zh-Hans-CN': SUPPORTED_LANGUAGES.ZH_CN,
  'zh-TW': SUPPORTED_LANGUAGES.ZH_TW,
  'zh-Hant': SUPPORTED_LANGUAGES.ZH_TW,
  'zh-Hant-TW': SUPPORTED_LANGUAGES.ZH_TW,
  'zh-HK': SUPPORTED_LANGUAGES.ZH_TW,
  'zh-Hant-HK': SUPPORTED_LANGUAGES.ZH_TW,
  
  // 英文变体
  'en': SUPPORTED_LANGUAGES.EN_US,
  'en-US': SUPPORTED_LANGUAGES.EN_US,
  'en-GB': SUPPORTED_LANGUAGES.EN_US,
  'en-CA': SUPPORTED_LANGUAGES.EN_US,
  'en-AU': SUPPORTED_LANGUAGES.EN_US,
  
  // 日文变体
  'ja': SUPPORTED_LANGUAGES.JA_JP,
  'ja-JP': SUPPORTED_LANGUAGES.JA_JP,
  
  // 韩文变体
  'ko': SUPPORTED_LANGUAGES.KO_KR,
  'ko-KR': SUPPORTED_LANGUAGES.KO_KR,
  
  // 法文变体
  'fr': SUPPORTED_LANGUAGES.FR_FR,
  'fr-FR': SUPPORTED_LANGUAGES.FR_FR,
  'fr-CA': SUPPORTED_LANGUAGES.FR_FR,
  
  // 德文变体
  'de': SUPPORTED_LANGUAGES.DE_DE,
  'de-DE': SUPPORTED_LANGUAGES.DE_DE,
  'de-AT': SUPPORTED_LANGUAGES.DE_DE,
  'de-CH': SUPPORTED_LANGUAGES.DE_DE,
  
  // 西班牙文变体
  'es': SUPPORTED_LANGUAGES.ES_ES,
  'es-ES': SUPPORTED_LANGUAGES.ES_ES,
  'es-MX': SUPPORTED_LANGUAGES.ES_ES,
  'es-AR': SUPPORTED_LANGUAGES.ES_ES,
  
  // 葡萄牙文变体
  'pt': SUPPORTED_LANGUAGES.PT_BR,
  'pt-BR': SUPPORTED_LANGUAGES.PT_BR,
  'pt-PT': SUPPORTED_LANGUAGES.PT_BR,
  
  // 俄文变体
  'ru': SUPPORTED_LANGUAGES.RU_RU,
  'ru-RU': SUPPORTED_LANGUAGES.RU_RU
};

/**
 * 语言工具类
 */
export class LanguageUtils {
  /**
   * 获取支持的语言列表
   */
  static getSupportedLanguages(): LanguageType[] {
    return Object.values(SUPPORTED_LANGUAGES);
  }

  /**
   * 检查语言是否支持
   * @param language 语言代码
   * @returns 是否支持
   */
  static isSupportedLanguage(language: string): boolean {
    return language in LANGUAGE_MAP;
  }

  /**
   * 标准化语言代码
   * @param language 原始语言代码
   * @returns 标准化的语言代码
   */
  static normalizeLanguage(language: string): LanguageType {
    const normalized = LANGUAGE_MAP[language.toLowerCase()] || 
                      LANGUAGE_MAP[language] || 
                      DEFAULT_LANGUAGE;
    return normalized;
  }

  /**
   * 从请求头中获取语言
   * @param acceptLanguage Accept-Language 头
   * @returns 语言代码
   */
  static getLanguageFromHeader(acceptLanguage?: string): LanguageType {
    if (!acceptLanguage) {
      return DEFAULT_LANGUAGE;
    }

    // 解析 Accept-Language 头
    const languages = acceptLanguage
      .split(',')
      .map(lang => {
        const [code, quality = '1'] = lang.trim().split(';q=');
        return {
          code: code.trim(),
          quality: parseFloat(quality)
        };
      })
      .sort((a, b) => b.quality - a.quality);

    // 查找第一个支持的语言
    for (const lang of languages) {
      if (this.isSupportedLanguage(lang.code)) {
        return this.normalizeLanguage(lang.code);
      }
    }

    return DEFAULT_LANGUAGE;
  }

  /**
   * 从查询参数中获取语言
   * @param lang 语言参数
   * @returns 语言代码
   */
  static getLanguageFromQuery(lang?: string): LanguageType {
    if (!lang) {
      return DEFAULT_LANGUAGE;
    }

    if (this.isSupportedLanguage(lang)) {
      return this.normalizeLanguage(lang);
    }

    return DEFAULT_LANGUAGE;
  }

  /**
   * 获取语言显示名称
   * @param language 语言代码
   * @returns 显示名称
   */
  static getLanguageDisplayName(language: LanguageType): string {
    const displayNames: Record<LanguageType, string> = {
      [SUPPORTED_LANGUAGES.ZH_CN]: '简体中文',
      [SUPPORTED_LANGUAGES.ZH_TW]: '繁體中文',
      [SUPPORTED_LANGUAGES.EN_US]: 'English',
      [SUPPORTED_LANGUAGES.JA_JP]: '日本語',
      [SUPPORTED_LANGUAGES.KO_KR]: '한국어',
      [SUPPORTED_LANGUAGES.FR_FR]: 'Français',
      [SUPPORTED_LANGUAGES.DE_DE]: 'Deutsch',
      [SUPPORTED_LANGUAGES.ES_ES]: 'Español',
      [SUPPORTED_LANGUAGES.PT_BR]: 'Português',
      [SUPPORTED_LANGUAGES.RU_RU]: 'Русский'
    };

    return displayNames[language] || language;
  }
}

export default LanguageUtils; 